#!/usr/bin/env python
# encoding: utf-8

# '''
# 面向对象深度优先和广度优先
# python3一律按照广度优先计算（旧式类、新式类）
# python2 旧式类深度优先、新式类广度优先
#
# MRO即方法解析顺序(method resolution order)，用于判断子类调用的属性来自于哪个父类。
# 在Python2.3之前，MRO是基于深度优先算法的，
# 自2.3开始使用C3算法，定义类时需要继承object，这样的类称为新式类，否则为旧式类（经典类）
# '''


# -----------------python2.x(深度优先-纵向扩展)、python3.x(广度优先-横向扩展)---------------------------
# 经典类采用深度优先搜索(python2.x(深度优先-纵向扩展))
# 经典类的搜索方式：从左到右，深度优先(python2.x(深度优先-纵向扩展))
class P1:
    def foo(self):
        print('p1-foo')


class P2:
    def foo(self):
        print('p2-foo')

    def bar(self):
        print('p2-bar')


class C1(P1, P2):
    pass


class C2(P1, P2):
    def bar(self):
        print('C2-bar')


class D(C1, C2):
    pass


d = D()
d.foo()  # 输出 p1-foo
d.bar()  # 输出 p2-bar


# 实例d调用foo()
# 时，搜索顺序是
# D = > C1 = > P1(python2.x(深度优先-纵向扩展))

# 实例d调用bar()
# 时，搜索顺序是
# D = > C1 = > P1 = > P2(python2.x(深度优先-纵向扩展))

print("///////////////////////////////")


# ----------------python3.x(广度优先-横向扩展)-----------------------
# 新式类采用广度优先搜索(横向扩展)（python3.x(广度优先-横向扩展)）


class PP1(object):
    def foo(self):
        print('p1-foo')


class PP2(object):
    def foo(self):
        print('p2-foo')

    def bar(self):
        print('p2-bar')


class CC1(PP1, PP2):
    pass


class CC2(PP1, PP2):
    def bar(self):
        print('C2-bar')


class DD(CC1, CC2):
    pass


dd = DD()
dd.foo()  # 输出 p1-foo
dd.bar()  # 输出 c2-bar
# 实例d调用foo()
# 时，搜索顺序是
# DD = > CC1 = > CC2 = > PP1（python3.x(广度优先-横向扩展)）
# 实例d调用bar()
# 时，搜索顺序是
# DD = > CC1 = > CC2（python3.x(广度优先-横向扩展)）
